#ifndef LISTA_CIRCULAR_H
#define LISTA_CIRCULAR_H

#if !defined(NULL)
#define NULL 0
#endif

#if !defined(FALSE)
#define FALSE 0
#endif

#if !defined(TRUE)
#define TRUE 1
#endif


typedef enum 
{
    LO_SIGUIENTE,
    LO_ANTERIOR
    } TMovim;

typedef struct TNodoCircular
{
    void*  Elem;
    struct TNodoCircular *Sig;
    } TNodoCircular;

typedef struct 
{
    TNodoCircular *Cte;
    int TamanioDato;
    } TListaCircular;

/*
** Primitivas del TDA Lista Circular
*/


/* LO_Crear 
@ PRE: LO no creada
@ POS: LO creada
*/    
void LO_Crear (TListaCircular *pLO, int TamanioDato);

/* LO_Vacia
@ PRE: LO creada
@ POS: Si la lista esta vacia devuelve TRUE, sino FALSE
*/    
int LO_Vacia (TListaCircular LO);

/* LO_Vaciar
@ PRE: LO creada
@ POS: Se eliminaron todos los elementos de LO 
*/    
void LO_Vaciar (TListaCircular *pLO);

/*
@ PRE: LO creada y no vacia
@ POS: Si M = LO_PRIMERO, el nuevo cte es el primero de la lista
       si M = LO_SIGUIENTE, 
       si M = LO_ANTERIOR, devuelve FALSE
       Si pudo realizar el movimiento devuelve TRUE, sino FALSE
*/    
int LO_MoverCte (TListaCircular *pLO, TMovim M );

/*
@ PRE: LO creada
@ POS: Se agrego E a la lista y es el nuevo corriente,
       si M = LO_PRIMERO o la lista esta vacia, se inserto como primero de la lista
       si M = LO_SIGUIENTE, se inserto despues del elemento coriente 
       si M = LO_ANTERIOR, se inserto antes del elemento coriente
       Si pudo insertar el elemento devuelve TRUE, sino FALSE
*/    
int LO_Insertar (TListaCircular *pLO, TMovim M, void* pE);


/*
@ PRE: LO creada y no vacia
@ POS: Se elimino el elemento corriente. El nuevo corriente es el siguiente de eliminado, o el anterior si este era el ultimo
*/    
void LO_BorrarCte (TListaCircular *pLO);


/*
@ PRE: LO creada y no vacia
@ POS:
*/    
void LO_ObtenerCte (TListaCircular LO, void* pE);


/*
@ PRE:
@ POS:
*/    
void LO_ModificarCte (TListaCircular *pLO, void* pE);


#endif
